#pragma once
#include <memory>
#include <queue>
#include <mutex>
#include "boost/asio.hpp"
#include "MsgNode.h"
#include "const.h"





using boost::asio::ip::tcp;

class Server;


class Session: public std::enable_shared_from_this<Session>
{
public:
    //io_context用来初始化socket_
    Session(boost::asio::io_context& io_context,Server *server);
    ~Session();
    void Start();
    tcp::socket& GetSocket()
    {
        return socket_;
    }

    std::string& GetUuid()
    {
        return uuid_;
    }
    void Send(const char *msg,int max_length,short msgid);
    void Send(const std::string msg,short msgid);
private:
    //用于回调的函数，用于处理读取来自客户端的数据
    void HandleRead(const boost::system::error_code &ec, std::size_t bytes_transferred,std::shared_ptr<Session> session);
    //用于回调的函数，用于处理写入数据到客户端
    void HandleWrite(const boost::system::error_code &ec,std::shared_ptr<Session> session);

    void HandleReadHead(const boost::system::error_code &ec, std::size_t bytes_transferred,std::shared_ptr<Session> session);
    void HandleReadMsg(const boost::system::error_code &ec, std::size_t bytes_transferred,std::shared_ptr<Session> session);
    void Close();
private:

    tcp::socket socket_;
    char _data[MAX_LENGTH];
    Server *server_;
    std::string uuid_;
    std::queue<std::shared_ptr<SendNode>> _send_queue;
    std::mutex _send_lock;


    //收到的头部消息结构体
    std::shared_ptr<MsgNode> _recv_head_node;
    //头部解析是否完成标志位
    bool _b_head_parse;
    //收到的消息结构体
    std::shared_ptr<RecvNode> _recv_msg_node;

    bool _b_close;
};